[2025-07-15] SSRF
🦥 본문
정의
Server Side Request Forgery. 공격자가 조작한 요청을 통해 서버가 공격자가 지정한 주소로 HTTP 요청을 보내도록 유도하는 공격
동작 흐름
예시
-
이용자가 입력한 URL에 요청을 보내는 경우
어떤 이미지 업로드 기능이 URL을 입력 받아 서버가 이미지를 대신 가져오는 구조
GET /fetch?url=http://localhost:8000/admin
위와 같은 URL을 보내어 서버 내부망을 접근하여 내부 리소스를 간접적으로 조회할 수 있다.
- 웹 서비스의 요청이 URL에 이용자의 입력값이 포함되는 경우.
- ../ 같은 방식으로 다른 내부망 API를 사용할 수 있다.
-
#을 통해 주석 처리하는 방식도 사용할 수 있다
def user_search(): user_name = request.args.get("user_name", "") user_type = "public" response = requests.get(f"{INTERNAL_API}/user/search?user_name={user_name}&user_type={user_type}")
위의 코드에서 public 권한만 사용할 수 있는 것처럼 보이지만
secret&user_type=private#
를 보내 user_type을 private 권한으로 변경할 수 있다.
- 웹 서비스의 요청 Body에 이용자의 입력값이 포함되는 경우
-
&를 통해 파라미터를 추가하여 기존의 값을 덮어씌울 수 있다.
session["idx"] = "guest" data = f"title={title}&body={body}&user={session['idx']}
위의 코드에서 title에
title&user=admin
을 넣으면 guest가 덮어씌워져서 admin으로 작동하게 된다.
-
대응 방안
- 최소 권한 원칙 적용 : 서버 혹은 클라우드 서비스 별 권한을 최소 권한으로 설정하여 피해 최소화 → Mitigation
- 로그 및 모니터링 강화 : 인바운드/아웃바운드 트래픽에 대한 모니터링 강화 및 내부망 workload 간 트래픽 감사
- 입력값 필터링 : SSRF를 시도하려는 변조된 트래픽을 막기 위한 입력값 필터링이 WAS(웹 어플리케이션 서버) 단에서 수행되어야만 함
Leave a comment